#include "geminai_gpio.h"

#define DEBOUNCE_DELAY_MS 50 // 防抖延时（毫秒）

static void IRAM_ATTR button_isr_handler(void* arg)
{
    static uint32_t last_isr_time = 0;
    uint32_t current_time = xTaskGetTickCountFromISR();

    if ((current_time - last_isr_time) * portTICK_PERIOD_MS < DEBOUNCE_DELAY_MS) {
        return; // 防抖处理
    }
    last_isr_time = current_time;
    led_status = !led_status;
    attribute_send_event |= PARA_LIGHT_SWITCH;
    // if(led_status)
    //     temp_ctl_para.led_pwm = 100;
}

void configure_button_interrupt() {
    gpio_config_t io_conf = {};
    //disable pull-down mode
    io_conf.pull_down_en = 0;
    //interrupt of rising edge
    io_conf.intr_type = GPIO_INTR_POSEDGE;
    //bit mask of the pins, use GPIO4/5 here
    io_conf.pin_bit_mask = (1ULL<<SW_LIGHT);
    //set as input mode
    io_conf.mode = GPIO_MODE_INPUT;
    //enable pull-up mode
    io_conf.pull_up_en = 1;
    gpio_config(&io_conf);
    // ////////////

    // 安装 GPIO 中断服务程序
    gpio_install_isr_service(0);
    gpio_isr_handler_add(SW_LIGHT, button_isr_handler, (void*) SW_LIGHT);
}

#define BUTTON_PRESS_DELAY  3000  // 3秒
//制冷开关检测
void cool_button_task(void *arg) {
    TickType_t press_start = 0;
    bool button_pressed = false;

    while (1) {
        if (gpio_get_level(SW_COOL) == 0) { // 按键按下
            if (!button_pressed) { // 第一次按下
                press_start = xTaskGetTickCount();
                button_pressed = true;
            }

            TickType_t press_duration = xTaskGetTickCount() - press_start;

            if (press_duration >= pdMS_TO_TICKS(BUTTON_PRESS_DELAY) && press_duration < pdMS_TO_TICKS(3500)) {
                // 3秒后执行动作
                // 在这里执行你的动作
                frig_sys_switch = !frig_sys_switch;
                attribute_send_event |= PARA_COOL_SWITCH;
                printf("cool switch turn\n");

                // 重置状态
                // button_pressed = false;
            } else if (press_duration >= pdMS_TO_TICKS(10000)) {
                // 10秒后执行其他动作
                // 在这里执行你的其他动作
                set_default_para();
                // 重置状态
                button_pressed = false;
            }
        } else { // 按键释放
            button_pressed = false;
        }

        vTaskDelay(pdMS_TO_TICKS(500)); // 每500ms检查一次按键状态
    }
}

void POW4G_EN_Init()//4G模块供电
{
    gpio_reset_pin(POW4G_EN);
    gpio_set_direction(POW4G_EN,GPIO_MODE_INPUT_OUTPUT);
    gpio_set_level(POW4G_EN,0);
}
void BAT_EN_Init()
{
    gpio_reset_pin(BAT_EN);
    gpio_set_direction(BAT_EN,GPIO_MODE_INPUT_OUTPUT);
    gpio_set_level(BAT_EN,1);
}
void POW24V_EN_Init()
{   gpio_reset_pin(POW24V_EN);
    gpio_set_direction(POW24V_EN,GPIO_MODE_INPUT_OUTPUT);
    gpio_set_level(POW24V_EN,0);
}
void POW3V3_EN_Init()
{   gpio_reset_pin(POW3V3_EN);
    gpio_set_direction(POW3V3_EN,GPIO_MODE_INPUT_OUTPUT);
    gpio_set_level(POW3V3_EN,0);
}
void RLY_COMP_Init()
{   gpio_reset_pin(RLY_COMP);
    gpio_set_direction(RLY_COMP,GPIO_MODE_INPUT_OUTPUT);
    gpio_set_level(RLY_COMP,0);
}
void RLY_FANS_Init()
{   gpio_reset_pin(RLY_FANS);
    gpio_set_direction(RLY_FANS,GPIO_MODE_INPUT_OUTPUT);
    gpio_set_level(RLY_FANS,0);
}
void RLY_DF_Init()
{   gpio_reset_pin(RLY_DF);
    gpio_set_direction(RLY_DF,GPIO_MODE_INPUT_OUTPUT);
    gpio_set_level(RLY_DF,0);
}
void SW_LIGHT_Init()
{   gpio_reset_pin(SW_LIGHT);
    gpio_set_direction(SW_LIGHT,GPIO_MODE_INPUT);
}
void SW_COOL_Init()
{   gpio_reset_pin(SW_COOL);
    gpio_set_direction(SW_COOL,GPIO_MODE_INPUT);
}
void SW_10G_Init()
{   gpio_reset_pin(SW_10G);
    gpio_set_direction(SW_10G,GPIO_MODE_INPUT);
}
void GPIO_DOOR_Init()
{   gpio_reset_pin(GPIO_DOOR);
    gpio_set_direction(GPIO_DOOR,GPIO_MODE_INPUT);
}
void UART1_DE_Init()
{   gpio_reset_pin(UART1_DE);
    gpio_set_direction(UART1_DE,GPIO_MODE_OUTPUT);
}

void All_gpio_init()
{
    configure_button_interrupt();//灯光按键中断初始化
    POW4G_EN_Init();
    POW24V_EN_Init();
    BAT_EN_Init();
    POW3V3_EN_Init();
    RLY_COMP_Init();
    RLY_FANS_Init();
    RLY_DF_Init();
    SW_COOL_Init();
    // SW_10G_Init();
    // GPIO_DOOR_Init();
    UART1_DE_Init();
    xTaskCreate(cool_button_task, "cool_button_task", 2048, NULL, 5, NULL);//制冷按键3S初始化
    POW3V3_EN_ON;//打开3.3v外设供电
    POW4G_EN_ON;
    POW24V_EN_ON;
}

void All_gpio_down()
{
    RLY_DF_OFF;
    RLY_FANS_OFF;
    RLY_COMP_OFF;
    POW24V_EN_OFF;
    POW4G_EN_OFF;
    BAT_EN_OFF;
    POW3V3_EN_OFF;
}
